Smart Pointers: Box, Rc, এবং RefCell এর ব্যবহার

Memory Management (মেমোরি ম্যানেজমেন্ট) - রাস্ট (Rust) - Computer Programming

294

Box (বক্স)

Box হল একটি স্মার্ট পয়েন্টার যা একক মালিকানা (ownership) এর সাথে heap-এ ডেটা সংরক্ষণ করতে ব্যবহৃত হয়। এটি মূলত যখন আপনি ডেটা heap-এ সংরক্ষণ করতে চান এবং সেই ডেটার মালিকানা শুধুমাত্র একটি ভেরিয়েবলের কাছে থাকবে, তখন ব্যবহার করা হয়।

ব্যবহার:

  • Box ডেটাকে heap-এ সংরক্ষণ করে, যা স্ট্যাকের সীমাবদ্ধতা থেকে পরিত্রাণ দেয় এবং বড় ডেটা structures বা অবজেক্টগুলির জন্য উপকারী।
  • এটি একমাত্র মালিকানার অধিকারী এবং ডেটার মালিকানা মুভ করা হয়। অর্থাৎ, Box-এ সংরক্ষিত ডেটা আর অন্য কোথাও ব্যবহৃত হতে পারে না যতক্ষণ না মালিকানা মুভ না করা হয়।

উদাহরণ:

fn main() {
    let b = Box::new(5);  // Box ব্যবহার করে একটি ভ্যালু heap-এ সংরক্ষণ
    println!("b = {}", b); // বক্স থেকে ডেটা অ্যাক্সেস করা
}

এখানে, Box::new(5) একটি i32 ভ্যালুকে heap-এ সংরক্ষণ করছে এবং b এর মাধ্যমে সেটি অ্যাক্সেস করা হচ্ছে।

কখন ব্যবহার করবেন:

  • যখন আপনি বড় ডেটা structures (যেমন ট্রি বা গ্রাফ) heap-এ সংরক্ষণ করতে চান।
  • যখন আপনার প্রোগ্রামে একক মালিকানা (ownership) থাকতে হবে, যেমন ডেটার একক মালিক থাকলে ফাংশনে এটি স্থানান্তর করা যাবে।

Rc (Reference Counted)

Rc হল একটি স্মার্ট পয়েন্টার যা multiple ownership সাপোর্ট করে এবং এটি একটি reference-counting মেকানিজম ব্যবহার করে। এর মাধ্যমে একাধিক ভেরিয়েবল একে অপরকে ডেটার রেফারেন্স প্রদান করতে পারে, এবং যখন সব রেফারেন্স মুক্ত হয়ে যায়, তখন ডেটা স্বয়ংক্রিয়ভাবে মুক্ত হয়ে যায়।

ব্যবহার:

  • Rc একাধিক মালিকানাকে সমর্থন করে, যেখানে একাধিক ভেরিয়েবল একই ডেটার রেফারেন্স ধারণ করতে পারে।
  • এটি প্রধানত single-threaded কনটেক্সটে ব্যবহৃত হয়, যেহেতু এটি thread-safe নয়। মাল্টি-থ্রেড কনকারেন্সি জন্য Rustে Arc (atomic Rc) ব্যবহার করা হয়।

উদাহরণ:

use std::rc::Rc;

fn main() {
    let a = Rc::new(5);  // Rc ব্যবহার করে ডেটা রেফারেন্স কাউন্টিংয়ের মাধ্যমে ভাগ করা
    let b = Rc::clone(&a);  // Rc ক্লোন করা হয়েছে, এখন b এবং a উভয়ই ডেটার মালিক
    println!("a = {}, b = {}", a, b);  // একাধিক মালিকানার সাথে ডেটা অ্যাক্সেস
}

এখানে, Rc::clone(&a) নতুন একটি রেফারেন্স তৈরি করেছে, কিন্তু আসল ডেটা একই 5 থাকছে। Rc ডেটার রেফারেন্স কাউন্ট বজায় রাখে।

কখন ব্যবহার করবেন:

  • যখন একাধিক মালিক ডেটার উপর কাজ করবে, এবং আপনি চাইছেন যে, ডেটা যতবার রেফারেন্স করা হবে ততবার তার সংখ্যা বাড়ুক।
  • সিঙ্গল থ্রেডেড কনটেক্সটে, যেমন গেম ডেভেলপমেন্টে বা গ্রাফ স্ট্রাকচার তৈরি করতে।

RefCell (Mutable Borrowing with Interior Mutability)

RefCell একটি স্মার্ট পয়েন্টার যা interior mutability এর ধারণা ব্যবহার করে, যা মালিকানার বাইরে থেকে মিউটেবল রেফারেন্স দেয়। এটি আপনাকে runtime এ borrow checking করে ডেটার মালিকানা বা রেফারেন্স বদলানোর সুযোগ দেয়।

ব্যবহার:

  • RefCell ব্যবহৃত হয় যখন আপনি immutably রেফারেন্সে ডেটা মিউটেবলভাবে পরিবর্তন করতে চান, তবে এক্ষেত্রে compile-time এর পরিবর্তে runtime এ চেক করা হয়।
  • এটি সাধারণত একাধিক মালিকের ডেটা মিউটেবলভাবে ব্যবহারের জন্য ব্যবহৃত হয়, যেখানে আপনি ডেটার মালিকানার বাইরে থেকে তাকে পরিবর্তন করতে চান।

উদাহরণ:

use std::cell::RefCell;

fn main() {
    let x = RefCell::new(5);  // RefCell ব্যবহার করে একটি ভ্যালু রেফারেন্স সুরক্ষিতভাবে মিউট করা
    *x.borrow_mut() = 10;  // borrow_mut ব্যবহার করে ডেটাকে পরিবর্তন করা
    println!("x = {}", x.borrow());  // borrow ব্যবহার করে ডেটা অ্যাক্সেস করা
}

এখানে, RefCell::new(5) একটি নতুন RefCell তৈরি করেছে যার ভিতরে 5 রাখা আছে। borrow_mut() মাধ্যমে আপনি ডেটার মিউটেবল রেফারেন্স পেয়েছেন এবং তার মান পরিবর্তন করেছেন। borrow() ব্যবহারের মাধ্যমে আপনি immutable রেফারেন্স পেয়েছেন এবং ডেটা পড়েছেন।

কখন ব্যবহার করবেন:

  • যখন আপনার একটি ডেটাকে runtime এ মিউটেবলভাবে পরিবর্তন করতে হবে, তবে মালিকানা সরাসরি বদলানো যাবে না।
  • সিঙ্গেল থ্রেড কনটেক্সটে, যখন আপনি একই ডেটার জন্য বিভিন্ন স্থানে mutable রেফারেন্স চান।

সারাংশ

  • Box: একক মালিকানা দিয়ে heap-এ ডেটা সংরক্ষণ করে এবং স্ট্যাকের সীমাবদ্ধতা থেকে মুক্তি দেয়।
  • Rc: একাধিক মালিকানাকে সমর্থন করে এবং রেফারেন্স কাউন্টিং মেকানিজম ব্যবহার করে ডেটার মালিকানা শেয়ার করতে সহায়তা করে।
  • RefCell: runtime-এ mutable রেফারেন্স প্রদান করে, যা interior mutability এর মাধ্যমে ডেটা পরিবর্তন করতে দেয়।

এই স্মার্ট পয়েন্টারগুলি রেস্টের মালিকানা এবং বোরোউ সিস্টেমের সাথে সুসংগতভাবে কাজ করে, যা নিরাপদ এবং দক্ষ ডেটা ম্যানেজমেন্ট নিশ্চিত করে।

Content added By
Promotion

Are you sure to start over?

Loading...